package alice.tuprolog;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class JavaObjectTest {
Prolog engine;
@Before
public void setUp() {
engine = new Prolog();
}
@Test public void nonexistentClass() throws PrologException {
SolveInfo solution = engine.solve("java_object('non.existant.Class', [], _).");
assertFalse(solution.isSuccess());
}
@Test public void nonexistentConstructor() throws PrologException {
SolveInfo solution = engine.solve("java_object('java.lang.Integer', [], _).");
assertFalse(solution.isSuccess());
}
@Test public void unboundParameter() throws PrologException {
SolveInfo solution = engine.solve("java_object('java.lang.String', [X], _).");
assertFalse(solution.isSuccess());
}
@Test public void alreadyBoundObject() throws PrologException {
String goal = "java_object('java.lang.Integer', [0], Z),\n" +
"java_object('java.lang.Integer', [1], Z).";
SolveInfo solution = engine.solve(goal);
assertFalse(solution.isSuccess());
}
@Test public void twoEqualObjects() throws PrologException {
String goal = "java_object('java.lang.Integer', [0], zero),\n" +
"java_object('java.lang.Integer', [0], expected),\n" +
"zero <- equals(expected) returns true.";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
}
@Test public void variableObjectName() throws PrologException {
String goal = "java_object('java.lang.Object', [], X1),\n" +
"java_object('java.lang.Object', [], X2).";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
assertEquals(new Struct("$obj_0"), solution.getTerm("X1"));
assertEquals(new Struct("$obj_1"), solution.getTerm("X2"));
}
@Test public void verifyUnderlyingObject() throws PrologException {
String goal = "java_object('java.lang.Integer[]', [0], A),\n" +
"A <- getClass returns C,\n" +
"C <- getName returns N.";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
assertEquals(new Struct("[Ljava.lang.Integer;"), solution.getTerm("N"));
}
@Test public void variableAsParameter() throws PrologException {
String goal = "java_object('java.lang.Integer', [0], Zero),\n" +
"java_object('java.lang.Integer', [0], Expected),\n" +
"Zero <- equals(Expected) returns Result.";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
assertEquals(Struct.TRUE, solution.getTerm("Result"));
}
}